/*
    SPDX-FileCopyrightText: 2021 Michail Vourlakos <mvourlakos@gmail.com>
    SPDX-License-Identifier: GPL-2.0-or-later
*/

#include "templateskeeper.h"

// local
#include "layoutscontroller.h"
#include "../../lattecorona.h"
#include "../../layout/centrallayout.h"
#include "../../layouts/manager.h"
#include "../../layouts/synchronizer.h"

namespace Latte {
namespace Settings {
namespace Part {

TemplatesKeeper::TemplatesKeeper(Settings::Controller::Layouts *parent, Latte::Corona *corona)
    : QObject(parent),
      m_corona(corona),
      m_layoutsController(parent)
{
}

TemplatesKeeper::~TemplatesKeeper()
{
    clear();
}

bool TemplatesKeeper::hasClipboardContents() const
{
    return (m_clipboardViews.rowCount() > 0);
}

Latte::Data::ViewsTable TemplatesKeeper::clipboardContents() const
{
    return m_clipboardViews;
}

void TemplatesKeeper::setClipboardContents(const Latte::Data::ViewsTable &views)
{
    if (m_clipboardViews == views) {
        return;
    }

    m_clipboardViews.clear();
    m_clipboardViews = views;

    Q_EMIT clipboardContentsChanged();
}

void TemplatesKeeper::clear()
{
    qDeleteAll(m_garbageLayouts);

    m_garbageLayouts.clear();
    m_storedViews.clear();
    m_clipboardViews.clear();
}

QString TemplatesKeeper::viewKeeperId(const QString &layoutCurrentId, const QString &viewId)
{
    return layoutCurrentId + QStringLiteral("#") + viewId;

}

QString TemplatesKeeper::storedView(const QString &layoutCurrentId, const QString &viewId)
{
    QString keeperid = viewKeeperId(layoutCurrentId, viewId);

    if (m_storedViews.containsId(keeperid)) {
        return m_storedViews[keeperid].originFile();
    }

    Latte::Data::Layout originallayout = m_layoutsController->originalData(layoutCurrentId);
    Latte::Data::Layout currentlayout = m_layoutsController->currentData(layoutCurrentId);
    Latte::CentralLayout *centralActive =  m_layoutsController->isLayoutOriginal(layoutCurrentId) ? m_corona->layoutsManager()->synchronizer()->centralLayout(originallayout.name) : nullptr;
    Latte::CentralLayout *central = centralActive ? centralActive : new Latte::CentralLayout(this, layoutCurrentId);

    if (!centralActive) {
        m_garbageLayouts << central;
    }

    if (!central->containsView(viewId.toInt())) {
        return QString();
    }

    QString storedviewpath = central->storedView(viewId.toInt());

    Latte::Data::View storedview;
    storedview.id = keeperid;
    storedview.isActive = false;
    storedview.setState(Data::View::OriginFromViewTemplate, storedviewpath, layoutCurrentId, viewId);
    m_storedViews << storedview;

    return storedviewpath;
}


}
}
}
